package com.haojg.controller;


import com.haojg.configuration.DBMemory;
import com.haojg.domain.ChatParam;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.ai.chat.messages.Message;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.UUID;

@Controller
public class CustomerServiceAgentController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping("/test.do")
    @ResponseBody
    public String test() {
        return "test";
    }


    @ResponseBody
    @RequestMapping("/chat.do")
    public List<Message> chat(@RequestBody ChatParam form) {
        String msg = form.getUserMsg();
        System.out.println("msg = " + msg);
        String sessionId = form.getSessionId();
        if (sessionId == null) {
            sessionId = UUID.randomUUID().toString();
        }
        if (this.chatClient == null) {
            this.initChatClient(sessionId);
        }
        String content = this.chatClient.prompt(msg).call().content();
        System.out.println("content = " + content);
        return chatMemory.get(sessionId, 2);
    }

    @Resource
    private OllamaChatModel model;

    //聊天 client
    private ChatClient chatClient;


    //开始聊天，生成唯一 sessionId
    @GetMapping("/start")
    public String start(Model model) {
        System.out.println("start2" + model);
        //创建随机会话 ID
        String sessionId = UUID.randomUUID().toString();
        model.addAttribute("sessionId", sessionId);
        //创建聊天 client
        this.initChatClient(sessionId);
        System.out.println("实例化this.chatClient=" + this.chatClient);
        return "chatPage";
    }


//    InMemoryChatMemory chatMemory = new InMemoryChatMemory();
    @Resource
    DBMemory chatMemory;


    private void initChatClient(String sessionId) {
        //创建聊天 client
        this.chatClient = ChatClient.builder(this.model)
                .defaultSystem("""
                        	您是“Funnair”航空公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
                        	您正在通过在线聊天系统与客户互动。
                        	您能够支持已有机票的预订详情查询、机票日期改签、机票预订取消等操作，其余功能将在后续版本中添加，如果用户问的问题不支持请告知详情。
                           在提供有关机票预订详情查询、机票日期改签、机票预订取消等操作之前，您必须始终从用户处获取以下信息：预订号、客户姓名。
                           在询问用户之前，请检查消息历史记录以获取预订号、客户姓名等信息，尽量避免重复询问给用户造成困扰。
                           在更改预订之前，您必须确保条款允许这样做。
                           如果更改需要收费，您必须在继续之前征得用户同意。
                           使用提供的功能获取预订详细信息、更改预订和取消预订。
                           如果需要，您可以调用相应函数辅助完成。
                           请讲中文。
                           今天的日期是 {current_date}.
                        """)
                .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory, sessionId, 10))
                .defaultFunctions("getBookingDetails", "changeBooking", "cancelBooking") // FUNCTION CALLING
                .build();
    }
}
